package com.server.store.data;

import java.util.ArrayList;
import java.util.List;

import com.google.appengine.api.datastore.EntityNotFoundException;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.Query;
import com.shared.model.Apporteur;
import com.shared.model.Compagnie;
import com.shared.model.Contrat;
import com.shared.model.Garantie;
import com.shared.model.Produit;
import com.shared.model.etat.EtatContrat;
import com.shared.utilitaire.Date;

/**
 * DAO de gestion des {@link Contrat}
 * @author queyroi
 *
 */
public class ContratManager extends DataManager<Contrat> {

	static{
		ObjectifyService.register(Produit.class);
		ObjectifyService.register(Compagnie.class);
		ObjectifyService.register(EtatContrat.class);
		ObjectifyService.register(Garantie.class);
		ObjectifyService.register(Date.class);
		ObjectifyService.register(Apporteur.class);
	}
	
	@Override
	public List<Contrat> getList() {
		List<Contrat> listReturn = new ArrayList<Contrat>();
		Objectify ofy = ObjectifyService.begin();
		Query<Contrat> query = ofy.query(Contrat.class);
		for(Contrat c : query){
			listReturn.add(c);
		}
		return listReturn;
	}
	
	public Compagnie getCompagnie(Contrat obj) throws EntityNotFoundException{
		Objectify ofy = ObjectifyService.begin();
		return ofy.get(Compagnie.class, obj.getCompagnie().getId());		
	}

	public Produit getProduit(Contrat obj) throws EntityNotFoundException{
		Objectify ofy = ObjectifyService.begin();
		return ofy.get(Produit.class, obj.getProduit().getId());		
	}
	
	public Apporteur getApporteur(Contrat obj) throws EntityNotFoundException{
		Objectify ofy = ObjectifyService.begin();
		return ofy.get(Apporteur.class, obj.getApporteur().getId());
	}
	
	public Apporteur getSousApporteur(Contrat obj) throws EntityNotFoundException{
		Objectify ofy = ObjectifyService.begin();
		return ofy.get(Apporteur.class, obj.getSousApporteur().getId());
	}

	@Override
	public void delete(Contrat obj) {
		Objectify ofy = ObjectifyService.beginTransaction(); 
		Objectify ofyDelete1 = ObjectifyService.begin(); 
		Objectify ofyDelete2 = ObjectifyService.begin(); 
		try{
			ofyDelete1.delete(obj.getEtatContrat());	
			ofyDelete2.delete(obj.getStatut());	
			ofy.delete(obj);
			ofy.getTxn().commit();
		}catch(Exception e){
			e.printStackTrace();
			if (ofy.getTxn().isActive())
		        ofy.getTxn().rollback();
		}
		
	}
	
	public EtatContrat getEtatContrat(Key<EtatContrat> key) throws EntityNotFoundException{				
		Objectify ofy = ObjectifyService.begin();		
		return ofy.get(key);		
	}
	
	public Contrat getContrat(Long key) throws EntityNotFoundException{
		Objectify ofy = ObjectifyService.begin();
		Contrat q = ofy.get(Contrat.class, key);
		return q;
	}

	public void setEtatContrat(EtatContrat etat,Contrat q){
		Objectify ofy = ObjectifyService.begin(); 		
		Objectify ofy2 = ObjectifyService.beginTransaction();
		try{						
			Key<EtatContrat> key = ofy2.put(etat);			
			if(q.getEtatContrat()!=null) ofy.delete(q.getEtatContrat());
			System.out.println(key);
			q.setEtatContrat(key);
			ofy2.getTxn().commit();
		}catch(Exception e){
			e.printStackTrace();
			if (ofy2.getTxn().isActive())
				ofy2.getTxn().rollback();
		}	
	} 
	
	public void setStatus(EtatContrat etat,Contrat q){
		Objectify ofy = ObjectifyService.begin(); 		
		Objectify ofy2 = ObjectifyService.beginTransaction();
		try{						
			Key<EtatContrat> key = ofy2.put(etat);			
			if(q.getStatut()!=null) ofy.delete(q.getStatut());
			System.out.println(key);
			q.setStatut(key);
			ofy2.getTxn().commit();
		}catch(Exception e){
			e.printStackTrace();
			if (ofy2.getTxn().isActive())
				ofy2.getTxn().rollback();
		}	
	} 
	
	
}
